home *** CD-ROM | disk | FTP | other *** search
/ Directorty Opus 5 - Magellan 2 / Opus 5 - Magellan 2.iso / Extras / D51_NUSource / Source / DOpusFuncs / DOpusFuncs.s < prev    next >
Text File  |  1996-01-06  |  19KB  |  428 lines

  1. *=- PROGRAM INFORMATION -=*************************************************************
  2. * DopusFuncs, ©1996 Leo Davidson                              *
  3. *=====================================================================================*
  4. * Purpose: Conversion of the DirToDest, ParentToDest, WinCopy and WinSwap scripts.    *
  5. *       This program does various operations on the paths of the source/dest          *
  6. *       listers under DOpus5.                              *
  7. *       It (will) also include any _small_ functions which are thought of.          *
  8. ***************************************************************************************
  9.  
  10. *=- ASSEMBLE-TIME SWITCHES -=**********************************************************
  11. * Comment out to disable the effect(s) described.                                     *
  12. ***************************************************************************************
  13. ;Beta_Version        ; Include Debug-Labels, Beta messages, etc.
  14. ;Beta_Version_ARexx    ; Include runtime-info about ARexx messages sent.
  15. DOpus5_Error        ; Enable Error messages via DOpus5/"dopus request".
  16. ;Test_Pool_On_OS3    ; Force use of non-ROM pool routines, even with OS3+.
  17. ;No_Requesters        ; Disable all requester-based output.
  18.             ; All error messages will be sent to shell.
  19.             ; Will also turn off "Please insert volume XXX" reqs.
  20. Default_Req        ; Make requesters the default for error messages.
  21.  
  22. *=- VERSION INFORMATION -=*************************************************************
  23. * Things like versions numbers, dates, and the name of the program are all defined    *
  24. * here as macros to save having to edit the entire source code.                       *
  25. *=====================================================================================*
  26. * The version strings should conform to the style guide. (Even though I think it      *
  27. * isn't the best way to do it, it's a standard :-(  ).                                *
  28. ***************************************************************************************
  29. PROGNAM    MACRO                Program name.
  30.     dc.b    "DOpusFuncs"        /No spaces!/
  31.     ENDM
  32. VERSION    MACRO                The version of the program.
  33.     dc.b    "1.6"            version.revision - /No leading zeros/
  34.     ENDM
  35. REVDATE    MACRO                Date of completion.
  36.     dc.b    "6.1.96"        DD.MM.YY - /No leading zeros/
  37.     ENDM
  38. REVDAT2    MACRO                Date of completion.
  39.     dc.b    "06-Jan-1996"        /Any format/ (Not in $VER string)
  40.     ENDM
  41. *=- ASSEMBLER INFORMATION/OPTIONS -=***************************************************
  42.     Section    Super_Main,Code        Assemble to Public Memory.
  43.     IFD    Beta_Version        -.
  44.     Opt    D+             |
  45.     Opt    hcln             |_ Debug info ON
  46.     ELSE                 |  for Beta Versions.
  47.     Opt    D-             |
  48.     ENDC                -'
  49. ***************************************************************************************
  50.     Bra    ProgBeg            Jump to the start of the program.
  51. ***************************************************************************************
  52. VerStr    Dc.b    "$VER: "        -.
  53.     PROGNAM                 |
  54.     IFD    Beta_Version         |
  55.     Dc.b    "_DEBUG"         |
  56.     ENDC                 |_ For 2.0+ Version Command
  57.     Dc.b    " "             |  (At the top to make "Version"
  58. ActVer    VERSION                 |  find it quicker!)
  59.     Dc.b    " ("             |
  60.     REVDATE                 |
  61.     Dc.b    ")",0            -'
  62.     Even
  63. ;=====================================================================================;
  64. ;    Include    Asm:Include/Nudel_Constants.i
  65. ;
  66. ;    include    dos/dos.i
  67. ;    include    dos/var.i
  68. ;    include    exec/types.i
  69. ;    include    exec/nodes.i
  70. ;    include    exec/memory.i
  71. ;    include    rexx/storage.i
  72. ;    include    intuition/intuition.i
  73. ;    include    intuition/intuitionbase.i
  74. ;    include    libraries/iffparse.i
  75. ;
  76. ;    include    ASM:LVO3.0/dos_lib.i
  77. ;    include    ASM:LVO3.0/exec_lib.i
  78. ;    include    ASM:LVO3.0/intuition_lib.i
  79. ;    include    ASM:LVO3.0/rexxsyslib_lib.i
  80. ;    include    ASM:LVO3.0/utility_lib.i
  81. ;    include    ASM:LVO3.0/iffparse_lib.i
  82. ;    include    ASM:LVO3.0/mathieeedoubbas_lib.i
  83. ;    include    ASM:LVO3.0/graphics_lib.i
  84.  
  85.     Include    Nudel_Symbols.gs
  86. ***************************************************************************************
  87. * The Variables (Address Equates for Space allocated at program start)                *
  88. ***************************************************************************************
  89.     RSReset
  90.     IFND    No_Requesters
  91. ;=====================================================================================;
  92. N_EasyStruct    Equ    __RS        ;- EasyStruct for EasyRequest ----------------;
  93. ;=====================================================================================;
  94. N_ES_Length    Rs.l    1        Length of the structure.
  95. N_ES_Flags    Rs.l    1        Flags (not currently supported).
  96. N_ES_Title    Rs.l    1        Ptr to NullTerm Title Text.
  97. N_ES_Body    Rs.l    1        Ptr to NullTerm Body Text.
  98. N_ES_Gadgets    Rs.l    1        Prt to Gadget(s) Texts.
  99. N_EasyStruct_Len    Equ    (__RS)-N_EasyStruct
  100.     ENDC
  101.  
  102. ;=====================================================================================;
  103. ; Nudel Info-Block Stuff                                  ;
  104. ;=====================================================================================;
  105. FakeNIB        Rs.b    NIB_SizeOf    ;- Fake NIB for setting pseudo-filenames -----;
  106. FakeNIB_Adrs    Rs.l    1        Address of FakeNIB (saves a few "lea"'s).
  107. Active_NIB    Rs.l    1        Ptr to currently "Active" NIB, or null.
  108. Base_NIB    Rs.l    1        Ptr to base NIB in linked list, or null.
  109. Last_NIB    Rs.l    1        Ptr to last NIB in linked list, or null.
  110. CAction        Rs.l    1        Ptr to current "Action" error message.
  111. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  112. BaseDir_NIB    Rs.l    1        Ptr to NIB for the Lock() on source-lister dir.
  113. ParentDir_NIB    Rs.l    1        Ptr to NIB for the Lock() on the parent dir.
  114. ;=====================================================================================;
  115.  
  116. ;=====================================================================================;
  117. ; READARGS() STUFF                                      ;
  118. ;=====================================================================================;
  119. RDA_Rtn        Rs.l    1        Pointer to returned RDArgs structure
  120. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  121. RDA_Array    Equ    __RS        Array of longwords matching template
  122. RDA_Template    Equ    *
  123. RexxPort_A    Rs.l    1
  124.         Dc.b    "RP=REXXPORT/A,"
  125. ClipEntry_KM    Rs.l    1
  126.         Dc.b    "CLIPENTRY/K/M,"
  127. DirToDest_S    Rs.l    1
  128.         Dc.b    "DIRTODEST/S,"
  129. ParentToDest_S    Rs.l    1
  130.         Dc.b    "PARENTTODEST/S,"
  131. WinCopy_S    Rs.l    1
  132.         Dc.b    "WINCOPY/S,"
  133. WinSwap_S    Rs.l    1
  134.         Dc.b    "WINSWAP/S,"
  135. NewSource_S    Rs.l    1
  136.         Dc.b    "NEWSOURCE/S,"
  137. SourceDir_K    Rs.l    1
  138.         Dc.b    "SOURCEDIR/K,"
  139. SourcePos_K    Rs.l    1
  140.         Dc.b    "SOURCEPOS/K,"
  141. SourceLock_S    Rs.l    1
  142.         Dc.b    "SOURCELOCK/S,"
  143. NewDest_S    Rs.l    1
  144.         Dc.b    "NEW=NEWDEST/S,"
  145. DestDir_K    Rs.l    1
  146.         Dc.b    "DIR=DESTDIR/K,"
  147. DestPos_K    Rs.l    1
  148.         Dc.b    "POS=DESTPOS/K,"
  149. DestLock_S    Rs.l    1
  150.         Dc.b    "LOCK=DESTLOCK/S,"
  151. NoFront_S    Rs.l    1
  152.         Dc.b    "NOFRONT/S,"
  153. NoNew_S        Rs.l    1
  154.         Dc.b    "NONEW/S"
  155. RDA_Temp_Len    Equ    *-RDA_Template
  156.         Dc.b    0
  157.         Even
  158. ;=====================================================================================;
  159. ; OPEN_LIBRARIES STRUCTURES                                  ;
  160. ;=====================================================================================;
  161. LibBases_Start    Equ    __RS
  162. LibData_Start    Equ    *
  163. ; NOTE: The open_lib_error routine requires lib-versions < 100
  164.  
  165. N_DOSBase    Rs.l    1
  166. DOSName_Ptr    Dc.l    N_DOSName-LibNames_Start
  167. DOSVers        Dc.l    37
  168.  
  169. N_RexBase    Rs.l    1
  170. RexName_Ptr    Dc.l    N_RexName-LibNames_Start
  171. RexVers        Dc.l    0
  172.  
  173. N_IFFBase    Rs.l    1
  174. IFFBase_Ptr    Dc.l    N_IFFName-LibNames_Start
  175. IFFVers        Dc.l    37
  176.     IFND    No_Requesters
  177. N_IntBase    Rs.l    1
  178. IntBase_Ptr    Dc.l    N_IntName-LibNames_Start
  179. IntVers        Dc.l    37
  180.     ENDC
  181. LibBases_Finish    Equ    __RS
  182. NumLibs    Equ    (LibBases_Finish-LibBases_Start)/4
  183. ;-------------------------------------------------------------------------------------;
  184. LibNames_Start    Equ    *
  185. N_DOSName    DOSNAME
  186. N_RexName    REXXSYSLIBNAME
  187. N_IFFName    IFFPARSENAME
  188.     IFND    No_Requesters
  189. N_IntName    INTNAME        Required by Open_Libraries_Error rtn.
  190.     ENDC
  191.     Even
  192. ;=====================================================================================;
  193. ; FLAG BYTES                                          ;
  194. ;=====================================================================================;
  195. STD_F_1        Rs.b    1        Standard files.
  196. EVEN_F_1    Rs.b    1        (Here as an Even)
  197. ;=====================================================================================;
  198. ; VARIOUS DATA                                          ;
  199. ;=====================================================================================;
  200. DosRtnC        Rs.l    1        Return code for DOS. (-> d0 at end)
  201. ;=====================================================================================;
  202. ; RawDoFmt() Stuff                                      ;
  203. ;=====================================================================================;
  204. ;    IFD    DATA_RAWDOFMT
  205. RDF_Size    Rs.l    1        Size of RawDoFmt() buffer.
  206. RDF_Adrs    Rs.l    1        Address of RawDoFmt() buffer.
  207. RDF_Array    Equ    __RS
  208. RDF_1_Long    Rs.l    1        -.
  209. RDF_2_Long    Rs.l    1         |_ DataArray for RawDoFmt()
  210. RDF_3_Long    Rs.l    1         |  *MUST* *ALL* be *LONGWORDS*
  211. RDF_4_Long    Rs.l    1        -'
  212. ;    ENDC
  213. ;=====================================================================================;
  214. ; VARIOUS ADDRESS-POINTERS, ETC                                  ;
  215. ;=====================================================================================;
  216. StarStk        Rs.l    1        Original Stack Pointer.
  217. PoolHead    Rs.l    1        Header for program's memory pool.
  218. CLI_Hdl        Rs.l    1        Output CLI (or whatever) handle.
  219. NudelPort    Rs.l    1        Pointer to our MsgPort.
  220. NudelRexxMsg    Rs.l    1        Pointer to our RexxMsg.
  221. CRexxPort    Rs.l    1        Ptr to name of current Rexx host to talk to.
  222. NudelIFFHandle    Rs.l    1        Pointer to our IFFHandle.
  223. NudelClipboardHandle Rs.l 1        Pointer to out Clipboard Handle (iffparse)
  224. ;=====================================================================================;
  225. ; Temp Storage and Buffers                                  ;
  226. ;=====================================================================================;
  227. Buffer1Len    Equ    1024
  228. Buffer1        Rs.b    Buffer1Len    Buffer for anything
  229. Buffer2Len    Equ    1024
  230. Buffer2        Rs.b    Buffer2Len    Buffer for anything
  231.  
  232.     IFD    Beta_Version_ARexx
  233. BufferALen    Equ    1024
  234. BufferA        Rs.b    BufferALen    Buffer for ARexx beta messages.
  235.     ENDC
  236.  
  237. Source_HandleLen Equ    42
  238. Source_Handle    Rs.b    Source_HandleLen
  239. Dest_HandleLen    Equ    42
  240. Dest_Handle    Rs.b    Dest_HandleLen
  241. DirName1BufferLen Equ    80            AmigaDOS limit is 30 chars,
  242. DirName1Buffer    Rs.b    DirName1BufferLen    but maybe OpusFTP w/ UNIX?
  243.  
  244. PathBuffer1Len    Equ    512
  245. PathBuffer1    Rs.b    PathBuffer1Len
  246. PathBuffer2Len    Equ    512
  247. PathBuffer2    Rs.b    PathBuffer2Len
  248.  
  249.  
  250. Temp001        Rs.l    1        -._ For temp storage
  251. Temp002        Rs.l    1        -'  in routines.
  252. ;=====================================================================================;
  253. NULLEND        Equ    __RS        ;- Overlays Start Here -----------------------;
  254. ;=====================================================================================;
  255. ;=====================================================================================;
  256. LENVARS        Equ    __RS        ;- End of variables/overlays -----------------;
  257. ;=====================================================================================;
  258.  
  259. *=- MAIN PROGRAM -=********************************************************************
  260. * Calls the subroutines.                                  *
  261. ***************************************************************************************
  262. ProgBeg    Bsr.s    Setup            Allocate Mem and initialize stuff.
  263.     Bsr    NewSource        Open a new Source lister, if required.
  264.     Bsr    NewDest            Open a new Destination lister, if required.
  265.     Bsr    ClipEntry        -.
  266.     Bsr    DirToDest         |
  267.     Bsr    ParentToDest         |- Perform the
  268.     Bsr    WinCopy             |  requested action(s)
  269.     Bsr    WinSwap            -'
  270.     Bra    Finish            Close/Deallocate everything and exit.
  271.  
  272. *=- SETUP -=***************************************************************************
  273. * Allocate Memory, Open Libraries, Parse Commandline, etc                  *
  274. * This MUST be the first Subroutine run.                          *
  275. ***************************************************************************************
  276. Setup    Move.l    #MEMF_PUBLIC!MEMF_CLEAR,d0    Public, Cleared mem.
  277.     Move.l    #5120,d1            Puddle size = 5k.
  278.     Move.l    #5120,d2            Thresh size = Puddle size.
  279.     Bsr    AsmCreatePool            Create this prog's mem pool.
  280.     Move.l    a0,-(SP)        Preserve PoolHeader
  281.     Bne.s    SGotMm1            -.
  282.     Addq.l    #4,a7             |_ If Allocation failed, Quick Exit.
  283.     Moveq    #RETURN_FAIL,d0         |  pool and do a quick exit.
  284.     RTS                -'
  285. SGotMm1    Move.l    #LENVARS,d0        Size of variables' memory
  286. ;;;;;;;    Move.l    a0,a0            PoolHeader to a0 for allocation.
  287.     Bsr    AsmAllocPooled        Allocate for the variables.
  288.     Move.l    (SP)+,a0        Restore PoolHeader
  289.     Move.l    d0,a5            Put variable/overlay address into A5
  290.     Tst.l    d0            (Moves to a? don't set CCR).
  291.     Bne.s    SGotMm2            -.
  292.     Bsr    AsmDeletePool         |
  293.     Addq.l    #4,a7             |- If Allocation failed, delete the
  294.     Moveq    #RETURN_FAIL,d0         |  pool and do a quick exit.
  295.     RTS                -'
  296. SGotMm2    Move.l    a0,PoolHead(a5)        Store header of memory pool.
  297.     Lea    FakeNIB(a5),a0        -._ Store address of FakeNIB(a5)
  298.     Move.l    a0,FakeNIB_Adrs(a5)    -'  for quick access later.
  299.     Move.l    #RETURN_OK,DosRtnC(a5)    Default DOS return code: "OK".
  300.     IFD    LENOVER
  301.     Lea    NULLEND(a5),a0        -.
  302.     Lea    Over01(pc),a1         |  Copy Overlay
  303.     Move.l    #(LENOVER/2)-1,d0     |- Backings onto
  304. OverPrL    Move.w    (a1)+,(a0)+         |  Overlay Space (word moves)
  305.     DBra    d0,OverPrL        -'
  306.     ENDC
  307. ;=====================================================================================;
  308.     Move.l    a7,StarStk(a5)        Store Stack Pointer
  309.     Addq.l    #4,StarStk(a5)        Compensate for this being a subrout.
  310.     IFND    No_Requesters
  311.     SetReqDefault            Set default to requester/shell.
  312.     ENDC
  313.     Bsr    Open_Libraries        Open libraries.
  314.     N_CallDOS    Output        -._ Get output Handle
  315.     Move.l    d0,CLI_Hdl(a5)        -'  (CLI window or whatever)
  316.  
  317. ;;;;;;;    Setup any non-zero default values for switch options here (below).
  318.     Bsr    RArgNor            Parse the commandline with ReadArgs
  319. ;=====================================================================================;
  320.     Tst.l    NoNew_S(a5)
  321.     Bne.s    NoNew_S_Skip
  322.     BSet    #SF1_NewListers,STD_F_1(a5)    Get(Source|Dest)Handle: Allow new listers
  323. NoNew_S_Skip
  324.  
  325.     Move.l    RexxPort_A(a5),CRexxPort(a5)    RexxPort from CommandLine.
  326.  
  327.     Bra.s    CreateNudelPort        Create our MsgPort.
  328. ;;;;;;;    RTS for us.
  329.  
  330. *=- FINISH -=**************************************************************************
  331. * Close Everything Down, Return Memory Etc to System and End Program              *
  332. *=====================================================================================*
  333. * All routines in this section MUST make sure that what they are about to free back   *
  334. * to the system has actually been taken in the first place! (With the exception of    *
  335. * the Main-Variable memory: if this could not be allocated the program will have      *
  336. * quit without calling Finish.)                                  *
  337. *=====================================================================================*
  338. * The Finish routine may be called from sub-routines at any level because the          *
  339. * original stack-pointer is restored so that RTS always quits the prog.              *
  340. ***************************************************************************************
  341. Finish
  342.     IFD    Beta_Version
  343.     Bsr_ErrorN    ErrAct_FinishBetaMsg(pc),#0
  344.     ENDC
  345.  
  346.     Bsr    CloseNudelIFF        Close our IFFhandle.
  347.     Bsr    FreeNudelIFF        Free our IFFHandle.
  348.     Bsr    CloseNudelClipboard    Close the Clipboard.
  349.     Bsr    DeleteNudelRexxMsg    Delete our RexxMsg (also clears arguments).
  350.     Bsr.s    DeleteNudelPort        Delete our MsgPort.
  351.     Bsr    NIBs_DeleteAll        Delete all Nudel-Info-Blocks.
  352.     Bsr    FArgNor            Free the commandline related memory.
  353.     Bsr    Close_Libraries        Close all open libraries.
  354.     Move.l    StarStk(a5),a7        Ignore all Branches.
  355.     Move.l    DosRtnC(a5),-(SP)    Store DOS return code...
  356.     Bsr    LeoDeletePool        Free the entire memory pool.
  357.     Move.l    (SP)+,d0        Return code to d0 for DOS.
  358.     RTS                End Program
  359.  
  360.     IFD    Beta_Version
  361. ErrAct_FinishBetaMsg
  362.     Dc.b    "Finish routine run",0
  363.     Even
  364.     ENDC
  365.  
  366. *=- EXTERNAL SUB-ROUTINES -=***********************************************************
  367. * Sub-routines stored in external "library" files.                      *
  368. ***************************************************************************************
  369. ;=====================================================================================;
  370. ; OS Subroutines.                                      ;
  371. ;=====================================================================================;
  372. SYS_CLIRITE    ; Write text using CLI_Hdl(a5) as output handle.
  373. SYS_READARG    ; ReadArgs() routine.
  374. SYS_FREEARG    ; FreeArgs() routine.
  375. SYS_CHKCRTC    ; Check for ^C-Break and abort program if sent.
  376. SYS_PORTS    ; CreateMsgPort(), DeleteMsgPort() routines.
  377.     Include    ASM:Source/Routines/System.s
  378. ;=====================================================================================;
  379. ; Data Subroutines. (Number/String Handling, etc etc)                      ;
  380. ;=====================================================================================;
  381. DATA_NULLLEN    ; Calculate the length of a Null-Term String.
  382. DATA_JOINNT    ; Join two null-terminated strings.
  383. DATA_JOINARRAY    ; Join together an array of strings.
  384. DATA_COPYCN3    ; Copy chars with Null-Term, don't copy Null, no Length
  385. DATA_CHARCNT    ; Copy x chars with Null-Term
  386. DATA_CHARCOPNL    ; Copy x chars with Null-Term and specified terminator.
  387. DATA_NUM2ASC    ; Raw Number to ASCII conversion.
  388. DATA_RAWDOFMT    ; RawDoFmt() routine.
  389.     Include    ASM:Source/Routines/Data.s
  390. ;=====================================================================================;
  391. ; NudelInfoBlock Subroutines.                                  ;
  392. ;=====================================================================================;
  393. NIBR_UNLOCK    ; DOS/UnLock
  394. NIBR_LOCK    ; DOS/Lock
  395.     Include    ASM:Source/Routines/NIB.s
  396. ;=====================================================================================;
  397. ; Directory Opus 5 Subroutines.                                  ;
  398. ;=====================================================================================;
  399. DO5_GetSource    ; Get first source handle.
  400. DO5_GetDest    ; Get first destination handle.
  401. DO5_GetPath    ; Get the path of a lister.
  402. DO5_GetFSelDir    ; Get first selected directory in a lister.
  403. ;DO5_GetFSelEnt    ; Get first selected entry in a lister.
  404. DO5_SetPath    ; Set (read) a new path into a lister.
  405. DO5_Refesh    ; Refresh a lister.
  406. DO5_Select    ; (De)select a lister entry.
  407. DO5_NewLister    ; Open a new lister.
  408. DO5_ListerSet    ; Generic "Lister Set..." command.
  409. DO5_GenError    ; Error message for things which really shouldn't go wrong.
  410. DO5_CopyLister    ; Copy a lister.
  411. DO5_ListerWait    ; Wait for a lister to finish what it's doing.
  412. DO5_DOpusFront    ; Move the DOpus screen to the front, unless "NoFront/S"
  413.     Include    ASM:Source/Routines/DOpus5_ARexx.s
  414. ;=====================================================================================;
  415. ; Other routines.                                      ;
  416. ;=====================================================================================;
  417.     Include    ASM:Source/Routines/ARexx.s
  418.     Include    ASM:Source/Routines/Pool.s
  419.     Include    ASM:Source/Routines/OpenLibraries.s
  420.     Include Asm:Source/Routines/Clipboard.s
  421. ***************************************************************************************
  422.     Include    ASM:Source/DOpusFuncs/NewLister.s
  423.     Include    ASM:Source/DOpusFuncs/ClipEntry.s
  424.     Include    ASM:Source/DOpusFuncs/DirToDest.s
  425.     Include    ASM:Source/DOpusFuncs/ParentToDest.s
  426.     Include    ASM:Source/DOpusFuncs/WinCopy.s
  427.     Include    ASM:Source/DOpusFuncs/WinSwap.s
  428.